# 代码实战解析解求解模型的方法

# numpy是做数值计算的
import numpy as np

# matplotlib是绘图的
import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D

# 设置seed随机数种子之后，下一个随机数的值必定固定
np.random.seed(42)
# 回归（有监督的机器学习），x,y

# x = np.random.rand(100,1) 产生100行1列的二维数组X，元素值为0-1之间服从均匀分布的随机数
# y = np.random.rand(100,2) 产生100行2列的二维数组Y，元素值为0-1之间服从均匀分布的随机数
x1 = 2*np.random.rand(100,1)
x2 = 3*np.random.rand(100,1)
#print(len(x))
#print(x)

# 这里要模拟出的数据y是代表真实的数据，所以也就是y_hat+error
# a = 4, b = 5, error = np.random.randn(100,1)
y = 5 + 4*x1+3*x2 + np.random.randn(100,1)

# np.c_用于拼接数组，np.ones((100,1))创建一个100行一列元素值都为1的数组
# 为了求解w0截距项。我们给x矩阵一开始加上一列全为1的x0,   此时x_b为X
x_b = np.c_[np.ones((100,1)),x1,x2]

# 实现解析解的公式来求解theta
θ = np.linalg.inv((x_b.T.dot(x_b))).dot(x_b.T).dot(y)
print(θ)

# 使用模型去做预测
x_new = np.array([[0],
                  [2]])
x_new2 = np.array([[1],
                   [5]])
x_new_b = np.c_[np.ones((2,1)),x_new,x_new2]
print(x_new_b)
y_predict = x_new_b.dot(θ)
print(y_predict)


# 绘图进行展示真实的数据点和我们预测的模型

# 绘图进行展示真实的数据点和我们预测的模型
plt.plot(x_new,y_predict,'r-')
plt.plot(x1,y,'b.')
plt.axis([0,4,0,30])
plt.show()

"""fig = plt.figure()
ax = plt.axes(projection='3d')
ax.plot3D(x_new,x_new2,y_predict)
plt.show()"""
